//
//  UITextView+Emoticons.swift
//  表情键盘
//
//  Created by wxy on 15/9/18.
//  Copyright © 2015年 wxy. All rights reserved.
//

import UIKit

extension UITextView {
    
    // 计算型属性，返回完整的表情字符串
    var emoticonText: String {
        
        let attrText = attributedText
        
        // 创建一个可变字符串
        var mtStr = String()
        
        attrText.enumerateAttributesInRange(NSRange(location: 0, length: attrText.length), options: []) { (dict, range, _) -> Void in
            
            // print("*****")
            // print(dict)
            // print(range)
            // 如果字典中包含 NSAttachment Key说明就是图片
            if let attachment = dict["NSAttachment"] as? EmoticonAttachment {
                
                // print("表情图片 \(attachment.chs)")
                mtStr += attachment.chs
            } else {
                let str = (attrText.string as NSString).substringWithRange(range)
                // print("文本内容 \(str)")
                mtStr += str
            }
        }
        return mtStr
    }
    
    // 插入表情符号
    func insertEmoticon(emoticon: Emoticon) {
        
        // 1. 空表情
        if emoticon.isEmpty {
            return
        }
        
        // 2. 删除按钮
        if emoticon.isRemove {
            deleteBackward()
            return
        }
        
        // 3. emoji
        if emoticon.emoji != nil {
            replaceRange(selectedTextRange!, withText: emoticon.emoji!)
            return
        }
        
        // print(emoticon)
        // 4. 表情图片 一定有图片
        // 0> 谁的事情谁负责 将代码放在最合适的地方
        let imageText = EmoticonAttachment.emoticonAttributeText(emoticon, font: font!)
        
        // 1> 从 textView 取出属性文本
        let mtStr = NSMutableAttributedString(attributedString: attributedText)
        
        // 2> 插入图片文字
        mtStr.replaceCharactersInRange(selectedRange, withAttributedString: imageText)
        
        // 3> 重新设置 textView 的内容
        // 1) 记录当前光标的位置
        let range = selectedRange
        // 2) 设置内容
        attributedText = mtStr
        // 3) 回复光标位置
        selectedRange = NSRange(location: range.location + 1, length: 0)
        // 4) 执行代理方法 - 代理就是在需要的时候，通知代理执行协议方法
        delegate?.textViewDidChange!(self)
    }

}
